package com.example.excelxssfexport.service;

import com.example.excelxssfexport.model.User;
import com.example.excelxssfexport.repository.UserRepository;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Excel导出服务类
 * 
 * 使用Apache POI XSSF组件将数据库中的用户数据导出为Excel文件
 */
@Service
public class ExcelExportService {
    
    /** 用户数据访问接口 */
    @Autowired
    private UserRepository userRepository;
    
    /**
     * 将所有用户数据导出为Excel格式
     * 使用Apache POI XSSF实现Excel 2007+格式(.xlsx)导出
     * 统计并输出导出操作耗时
     * 
     * @return 包含Excel数据的字节输出流
     * @throws IOException IO操作异常
     */
    public ByteArrayOutputStream exportUsersToExcel() throws IOException {
        // 记录导出开始时间，用于计算耗时
        long startTime = System.currentTimeMillis();
        
        // 从数据库获取所有用户数据
        List<User> users = userRepository.findAll();
        
        System.out.println("从数据库查询到 " + users.size() + " 条用户数据准备导出");
        
        // 检查是否有重复或异常数据
        Set<Long> userIds = new HashSet<>();
        int duplicateCount = 0;
        int nullIdCount = 0;
        
        for (User user : users) {
            if (user.getId() == null) {
                nullIdCount++;
            } else {
                if (!userIds.add(user.getId())) {
                    duplicateCount++;
                }
            }
        }
        
        System.out.println("导出数据统计 - 总数: " + users.size() + ", ID为空: " + nullIdCount + ", 重复ID: " + duplicateCount);
        
        // 如果ID为空的数据超过10%，输出警告
        if (nullIdCount > 0 && ((double) nullIdCount / users.size()) > 0.1) {
            System.out.println("警告: 超过10%的数据ID为空，可能影响数据一致性");
        }
        
        // 创建工作簿和工作表
        Workbook workbook = new XSSFWorkbook(); // 使用XSSF支持Excel 2007+格式
        Sheet sheet = workbook.createSheet("Users"); // 创建名为"Users"的工作表
        
        // 创建表头行
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("ID");
        headerRow.createCell(1).setCellValue("Username");
        headerRow.createCell(2).setCellValue("Email");
        headerRow.createCell(3).setCellValue("Full Name");
        headerRow.createCell(4).setCellValue("Age");
        
        // 创建数据行，遍历所有用户数据
        int rowNum = 1;
        for (User user : users) {
            Row row = sheet.createRow(rowNum++);
            
            // ID列
            if (user.getId() != null) {
                Cell idCell = row.createCell(0);
                idCell.setCellValue(user.getId());
                // 添加调试信息，特别是关注1000-9999范围内的ID
                if (user.getId() >= 1000 && user.getId() <= 9999) {
                    System.out.println("导出用户ID: " + user.getId() + ", 行号: " + (rowNum - 1));
                }
            } else {
                row.createCell(0).setCellValue("");
            }
            
            row.createCell(1).setCellValue(user.getUsername());     // 用户名列
            row.createCell(2).setCellValue(user.getEmail());        // 邮箱列
            row.createCell(3).setCellValue(user.getFullName());     // 全名列
            row.createCell(4).setCellValue(user.getAge());          // 年龄列
        }
        
        // 自动调整列宽以适应内容
        for (int i = 0; i < 5; i++) {
            sheet.autoSizeColumn(i);
        }
        
        // 特别处理ID列宽度，确保能显示像9999这样的数字
        // 在Excel中，一个字符单位是1/256个字符宽度
        // 数字9999大约需要4个字符宽度，我们设置为15个字符宽度(15 * 256 = 3840)
        sheet.setColumnWidth(0, 3840);
        
        // 将工作簿写入输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);
        workbook.close();
        
        // 记录导出结束时间并计算耗时
        long endTime = System.currentTimeMillis();
        System.out.println("导出耗时: " + (endTime - startTime) + " 毫秒");
        
        return outputStream;
    }
}